#include <pthread.h>
#include <iostream>
using namespace std;



#include <pthread.h>
#include <iostream>
using namespace std;

pthread_t p;
pthread_mutex_t lock;

void recursing()
{
    static int cnt = 0;
    if(cnt == 10) return; // 修复：使用比较运算符
    cout << "enter recursing, times:" << ++cnt << endl;
    pthread_mutex_lock(&lock);
    recursing();
    pthread_mutex_unlock(&lock); // 注意：解锁操作
}

void *routine(void* arg)
{
    cout << "enter routine()" << endl;
    recursing();
    return nullptr;
}

int main()
{
    // 初始化递归锁
    pthread_mutexattr_t attr;
    pthread_mutexattr_init(&attr);
    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
    pthread_mutex_init(&lock, &attr);
    pthread_mutexattr_destroy(&attr);

    pthread_create(&p, nullptr, routine, nullptr);

    int n = pthread_join(p, nullptr);
    (void)n;

    pthread_mutex_destroy(&lock); // 销毁互斥锁
    return 0;
}


// 非递归锁 递归引发死锁
// pthread_t p;
// pthread_mutex_t lock;

// void recursing()// 死锁
// {
//     static int cnt = 0;
//     if(cnt == 10) return;
//     cout << "enter recursing, times:" << ++cnt << endl;
//     pthread_mutex_lock(&lock);
//     recursing();
// }

// void *routine(void* arg)
// {
//     cout << "enter routine()" << endl;
//     recursing();
//     return nullptr;
// }

// int main()
// {
//     pthread_create(&p, nullptr, routine, nullptr);
    

//     int n = pthread_join(p, nullptr);
//     (void)n;

//     return 0;
// }